package icu.d4peng.basic.core.vo;

import icu.d4peng.basic.core.enums.HttpStatusEnum;
import icu.d4peng.basic.core.util.JacksonUtil;

import java.io.Serializable;

/**
 * R:结果视图
 *
 * @author d4peng <a href="d4peng@qq.com">d4peng@qq.com</a>
 * @since 2023.12.02
 */
public class R<T> implements Serializable {

	/**
	 * 状态码
	 */
	private Integer code;

	/**
	 * 信息
	 */
	private String msg;

	/**
	 * 数据泛型
	 */
	private T data;

	public R(HttpStatusEnum httpStatusEnum) {
		this(httpStatusEnum.value(), httpStatusEnum.getReasonPhrase(), null);
	}

	public R(HttpStatusEnum httpStatusEnum, T data) {
		this(httpStatusEnum.value(), httpStatusEnum.getReasonPhrase(), data);
	}

	public R() {
		this(null, null, null);
	}

	public R(Integer code) {
		this(code, null, null);
	}

	public R(String msg) {
		this(null, msg, null);
	}

	public R(T data) {
		this(null, null, data);
	}

	public R(String msg, T data) {
		this(null, msg, data);
	}

	public R(Integer code, T data) {
		this(code, null, data);
	}

	public R(Integer code, String msg) {
		this(code, msg, null);
	}

	public R(Integer code, String msg, T data) {
		this.code = code;
		this.msg = msg;
		this.data = data;
	}

	/**
	 * 成功
	 * @param code 状态码
	 * @param msg 信息
	 * @param data 数据
	 * @param <T> 泛型
	 * @return 结果
	 */
	public static <T> R<T> success(Integer code, String msg, T data) {
		return new R<T>(code, msg, data);
	}

	/**
	 * 成功
	 * @param httpStatusEnum Http状态枚举
	 * @param data 数据
	 * @param <T> 泛型
	 * @return 结果
	 */
	public static <T> R<T> success(HttpStatusEnum httpStatusEnum, T data) {
		return success(httpStatusEnum.value(), httpStatusEnum.getReasonPhrase(), data);
	}

	/**
	 * 成功
	 * @param data 数据
	 * @param <T> 泛型
	 * @return 结果
	 */
	public static <T> R<T> success(T data) {
		return success(HttpStatusEnum.OK, data);
	}

	/**
	 * 失败
	 * @param code 状态码
	 * @param msg 信息
	 * @param data 数据
	 * @param <T> 泛型
	 * @return 结果
	 */
	public static <T> R<T> fail(Integer code, String msg, T data) {
		return new R<T>(code, msg, data);
	}

	/**
	 * 失败
	 * @param httpStatusEnum Http状态枚举
	 * @param data 数据
	 * @param <T> 泛型
	 * @return 结果
	 */
	public static <T> R<T> fail(HttpStatusEnum httpStatusEnum, T data) {
		return fail(httpStatusEnum.value(), httpStatusEnum.getReasonPhrase(), data);
	}

	/**
	 * 失败
	 * @param data 数据
	 * @param <T> 泛型
	 * @return 结果
	 */
	public static <T> R<T> fail(T data) {
		return fail(HttpStatusEnum.BAD_REQUEST, data);
	}

	public Integer getCode() {
		return code;
	}

	public R<T> setCode(Integer code) {
		this.code = code;
		return this;
	}

	public String getMsg() {
		return msg;
	}

	public R<T> setMsg(String msg) {
		this.msg = msg;
		return this;
	}

	public T getData() {
		return data;
	}

	public R<T> setData(T data) {
		this.data = data;
		return this;
	}

	@Override
	public String toString() {
		return JacksonUtil.toJson(this);
	}

}
